﻿/*  Eleven Business Suite : Un ERP básico para pequeños empresarios.
 *  Copyright (C) 2011  Francis Bolaños Arias
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>;.
 */

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ElevenCore;
using ElevenGlobal;

namespace ElevenGUI
{
    public partial class FrmOrdenCompra : Form
    {

        private DataTable dtOrdenesCompra;

        private GLOBuscador buscador;

        public FrmOrdenCompra()
        {
            InitializeComponent();
        }

        #region Eventos Controles


        private void btnAgregar_Click(object sender, EventArgs e)
        {
            try
            {
                SCMDTOrdenCompra detalle = new SCMDTOrdenCompra(0, int.Parse(Cache.ordproducto.Cells[0].Value.ToString())
                    , int.Parse(txtCantidad.Text), double.Parse(txtPrecioUnitario.Text.Replace('.', ',')));
                double valor = detalle.Cantidad * detalle.PrecioUnitario;
                dgvDTOrdenCompra.Rows.Add(detalle.Cantidad.ToString()
                    , detalle.IdProducto
                    , Cache.ordproducto.Cells[2].Value.ToString()
                    , String.Format("{0:0.00}", detalle.PrecioUnitario), String.Format("{0:0.00}", valor));
                calcularSubTotal();
                calcularDescuento();
                calcularImpuesto();
                calcularTotal();
            }
            catch (Exception ex)
            {
                GLOMensajeError error = new GLOMensajeError("Error al validar los datos.", "Por favor revise los datos, ya que alguno está en algún formato incorrecto\n\n Mensaje técnico del error: " + ex.Message, "Exception");
                error.ShowDialog();
            }
        }

        private void btnQuitar_Click(object sender, EventArgs e)
        {
            try
            {
                dgvDTOrdenCompra.Rows.Remove(dgvDTOrdenCompra.SelectedRows[0]);
                calcularSubTotal();
                calcularDescuento();
                calcularImpuesto();
                calcularTotal();
            }
            catch (ArgumentOutOfRangeException) { }
        }

        //private void cbProveedor_SelectedIndexChanged(object sender, EventArgs e)
        //{
        //    txtProveedor.Text = dtProveedores.Rows[int.Parse(cbProveedor.SelectedIndex.ToString())]["Nombre"].ToString();
        //    dgvDTOrdenCompra.Rows.Clear();
        //    txtDescuento.Text = "0,0";
        //    txtCliente.Text = "";
        //    txtDireccion.Text = "";
        //    txtCantidad.Text = "";
        //    txtPrecioUnitario.Text = "";
        //    txtSubTotal.Text = "0,0";
        //    txtIVI.Text = "0,0";
        //    txtTotal.Text = "0,0";
        //}

        private void cbIVI_CheckedChanged(object sender, EventArgs e)
        {
            if (!cbIVI.Checked)
            {
                txtIVI.Text = "0,0";
                calcularSubTotal();
                calcularDescuento();
                calcularImpuesto();
                calcularTotal();
            }
            else
            {
                calcularSubTotal();
                calcularDescuento();
                calcularImpuesto();
                calcularTotal();
            }
        }

        private void txtDescuento_TextChanged(object sender, EventArgs e)
        {
            calcularSubTotal();
            calcularDescuento();
            calcularImpuesto();
            calcularTotal();
        }

        private void cbDescuento_CheckedChanged(object sender, EventArgs e)
        {
            if (!cbDescuento.Checked)
            {
                txtDescuento.Text = "0,0";
                txtDescuentoCalcu.Text = "0,0";
            }
            else
            {
                calcularSubTotal();
                calcularDescuento();
                calcularImpuesto();
                calcularTotal();
            }
        }

        #endregion

        #region Eventos Botones NGEC

        private void btnNuevo_Click(object sender, EventArgs e)
        {
            habilitar();
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                int TipoCompra = 0;
                if (rbContado.Checked)
                {
                    TipoCompra = (int)SCMOrdenCompra.TipoCompras.Contado;
                }
                else if (rbCredito.Checked)
                {
                    TipoCompra = (int)SCMOrdenCompra.TipoCompras.Credito;
                }

                int IVI = 0;
                if (cbIVI.Checked)
                {
                    IVI = (int)SCMOrdenCompra.IVIs.ConImpuesto;
                }
                else
                {
                    IVI = (int)SCMOrdenCompra.IVIs.SinImpuesto;
                }

                int Entregado = 0;
                if (cbEntregado.Checked)
                {
                    Entregado = (int)SCMOrdenCompra.Entregados.Entregado;
                }
                else
                {
                    Entregado = (int)SCMOrdenCompra.Entregados.NoEntregado;
                }

                DataTable Detalle = new DataTable("11DTORDENCOMPRA");
                DataColumn columna = new DataColumn("IdProducto");
                columna.DataType = System.Type.GetType("System.Int32");
                Detalle.Columns.Add(columna);
                columna = new DataColumn("Cantidad");
                columna.DataType = System.Type.GetType("System.Int32");
                Detalle.Columns.Add(columna);
                columna = new DataColumn("PrecioUnitario");
                columna.DataType = System.Type.GetType("System.Double");
                Detalle.Columns.Add(columna);

                foreach (DataGridViewRow drv in dgvDTOrdenCompra.Rows)
                {
                    DataRow dr = Detalle.NewRow();
                    dr["IdProducto"] = int.Parse(drv.Cells[1].Value.ToString());
                    dr["Cantidad"] = int.Parse(drv.Cells[0].Value.ToString());
                    dr["PrecioUnitario"] = double.Parse(drv.Cells[3].Value.ToString());
                    Detalle.Rows.Add(dr);
                }

                double Descuento;
                if (cbDescuento.Checked)
                {
                    Descuento = double.Parse(txtDescuento.Text);
                    if ((Descuento < 0.0) || (Descuento > 100))
                    {
                        throw new FormatException("El descuento debe estar entre 0 y 100");
                    }
                }
                else
                {
                    Descuento = 0.0;
                }

                DateTime fecha = new DateTime(dtpFecha.Value.Year, dtpFecha.Value.Month, dtpFecha.Value.Day
                    , DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second, DateTime.Now.Millisecond);

                SCMOrdenCompra orden = new SCMOrdenCompra(0, Convert.ToInt32(Cache.ordproveedor.Cells[0].Value.ToString()), txtCliente.Text
                    , txtDireccion.Text, fecha, TipoCompra, IVI, Entregado, Descuento, Detalle);

                if (orden.insertar())
                {
                    GLOMensajeAceptar mensaje = new GLOMensajeAceptar("Órden insertada correctamente.");
                    mensaje.ShowDialog();
                    inhabilitar();
                }
                else
                {
                    GLOMensajeError error = new GLOMensajeError("Error grave al conectar con la base de datos.", "Este error puede deberse a que se haya perdido la conexión con la base de datos o ocurriera un error en el sistema.\n\n Mensaje técnico del error: " + Cache.ErrorActual, "SqlException");
                    error.ShowDialog();
                }

            }
            catch (NullReferenceException ne)
            {
                GLOMensajeError error = new GLOMensajeError("Error de validación", "Debe ingresar productos en la orden que desea guardar.\n\n Mensaje técnico del error: " + ne.Message, "NullReferenceException");
                error.ShowDialog();
            }
            catch (FormatException fe)
            {
                GLOMensajeError error = new GLOMensajeError("No se eligió un cliente.", "Si eligió descuento, ¿puso un valor de descuento entre 0 y 100?.\n\n Mensaje técnico del error: " + fe.Message, "FormatException");
                error.ShowDialog();
            }
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("ADVERTENCIA: Posible corrupción en los datos.\n\nUsted está por eliminar una orden de compra. "
                + "El sistema permite eliminar órdenes de compra en caso de haber ingresado órdenes con información errónea. "
                + "Si la órden fue ingresada hace horas o días es posible que la cantidad de inventario que aumentó se haya"
                + " gastado por lo cual si la borra es posible que le aparezcan números negativos.\n\n"
                + "Si le aparecen números negativos debrá añadir una órden de compra que agregue esos artículos faltantes.\n\n"
                + "¿Desea eliminar la órden de compra?", "Eliminar Órden de Compra", MessageBoxButtons.YesNo) 
                == DialogResult.Yes)
            {
                //Vamos a eliminar órden...
                try
                {
                    DataRow dr = dtOrdenesCompra.Rows[0];
                    SCMOrdenCompra orden = new SCMOrdenCompra();
                    orden.IdOrdenCompra = int.Parse(dr[0].ToString());
                    if (orden.eliminar())
                    {
                        GLOMensajeAceptar mensaje = new GLOMensajeAceptar("Se ha eliminado la órden.");
                        mensaje.ShowDialog();
                        inhabilitar();
                    }
                    else
                    {
                        GLOMensajeError error = new GLOMensajeError("Error grave al conectar con la base de datos.", "Este error puede deberse a que se haya perdido la conexión con la base de datos o ocurriera un error en el sistema.\n\n Mensaje técnico del error: " + Cache.ErrorActual, "SqlException");
                        error.ShowDialog();
                    }
                }
                catch (NullReferenceException ne) {
                    GLOMensajeError error = new GLOMensajeError("Error de validación", "No ha escogido una orden para eliminar.\n\n Mensaje técnico del error: " + ne.Message, "NullReferenceException");
                    error.ShowDialog();
                }
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            inhabilitar();
        }

        #endregion

        #region Metodos

        private void calcularSubTotal()
        {
            double subtotal = 0.0;
            foreach (DataGridViewRow dr in dgvDTOrdenCompra.Rows)
            {
                subtotal += double.Parse(dr.Cells[4].Value.ToString());
            }
            txtSubTotal.Text = String.Format("{0:0.00}", subtotal);
        }

        private void calcularDescuento()
        {
            if (cbDescuento.Checked)
            {
                try
                {
                    txtDescuento.ForeColor = Color.Black;
                    txtDescuentoCalcu.Text = "0,0";
                    double subtotal = double.Parse(txtSubTotal.Text);
                    double desc = double.Parse(txtDescuento.Text);
                    txtDescuentoCalcu.Text = String.Format("{0:0.00}", (subtotal * desc) / 100);
                }
                catch (FormatException)
                {
                    txtDescuento.ForeColor = Color.Red;
                }
            }
        }

        private void calcularImpuesto()
        {
            if (cbIVI.Checked)
            {
                double subtotal = double.Parse(txtSubTotal.Text);
                double desc = double.Parse(txtDescuentoCalcu.Text);
                txtIVI.Text = String.Format("{0:0.00}", ((subtotal - desc) * Configuracion.impuestoVenta) / 100);
            }
        }

        private void calcularImpuestoFactura(int ImpuestoFactura)
        {
            if (cbIVI.Checked)
            {
                double subtotal = double.Parse(txtSubTotal.Text);
                double desc = double.Parse(txtDescuentoCalcu.Text);
                txtIVI.Text = String.Format("{0:0.00}", ((subtotal - desc) * ImpuestoFactura) / 100);
            }
        }

        private void calcularTotal()
        {
            double subtotal = double.Parse(txtSubTotal.Text);
            double impuesto = double.Parse(txtIVI.Text);
            double desc = double.Parse(txtDescuentoCalcu.Text);
            txtTotal.Text = String.Format("{0:0.00}", (subtotal - desc) + impuesto);
        }

        private void cargarOrden()
        {
            try
            {
                DataRow dr = dtOrdenesCompra.Rows[0];
                txtOrdNum.Text = dr[0].ToString();
                txtProveedor.Text = dr[9].ToString();
                txtCliente.Text = dr[2].ToString();
                txtDireccion.Text = dr[3].ToString();
                dtpFecha.Value = (DateTime)dr[4];
                int TipoCompra = int.Parse(dr[5].ToString());
                if (TipoCompra == (int)SCMOrdenCompra.TipoCompras.Contado)
                {
                    rbContado.Checked = true;
                }
                else
                {
                    rbCredito.Checked = true;
                }
                int IVI = int.Parse(dr[6].ToString());
                if (IVI != 1)
                {
                    cbIVI.Checked = true;
                }
                else
                {
                    cbIVI.Checked = false;
                }
                int Entregado = int.Parse(dr[7].ToString());
                if (Entregado == (int)SCMOrdenCompra.Entregados.Entregado)
                {
                    cbEntregado.Checked = true;
                }
                else
                {
                    cbEntregado.Checked = false;
                }
                dgvDTOrdenCompra.Rows.Clear();
                DataTable dt = SCMDTOrdenCompra.consultar(int.Parse(dr[0].ToString()));
                foreach (DataRow dr2 in dt.Rows)
                {
                    dgvDTOrdenCompra.Rows.Add(dr2[2].ToString(), dr2[1].ToString(), dr2[4].ToString(), dr2[3].ToString()
                        , (double.Parse(dr2[2].ToString()) * double.Parse(dr2[3].ToString())));

                }
                txtDescuento.Text = dr[15].ToString();
                calcularSubTotal();
                calcularDescuento();
                calcularImpuestoFactura(int.Parse(dr[16].ToString()));
                calcularTotal();
            }
            catch (IndexOutOfRangeException) { }
        }

        private void habilitar()
        {
            rbContado.Checked = true;
            txtDescuento.Text = "0,0";
            txtDescuento.ReadOnly = false;
            cbDescuento.Enabled = true;
            txtOrdNum.Text = "XXXXXX";
            txtCliente.Text = "";
            txtDireccion.Text = "";
            txtCantidad.Text = "";
            //txtPrecioUnitario.Text = "";
            txtSubTotal.Text = "0,0";
            txtIVI.Text = "0,0";
            txtTotal.Text = "0,0";
            dgvDTOrdenCompra.Rows.Clear();
            btnBuscarProd.Enabled = true;
            txtCliente.ReadOnly = false;
            txtDireccion.ReadOnly = false;
            dtpFecha.Enabled = true;
            rbContado.Enabled = true;
            rbCredito.Enabled = true;
            btnAgregar.Enabled = true;
            btnQuitar.Enabled = true;
            cbIVI.Enabled = true;
            cbEntregado.Enabled = true;
            txtCantidad.ReadOnly = false;
            txtPrecioUnitario.ReadOnly = false;

            btnNuevo.Enabled = false;
            btnGuardar.Enabled = true;
            btnEliminar.Enabled = false;
            btnCancelar.Enabled = true;
            btnBuscarOrden.Enabled = false;
            btnOrdenProv.Enabled = false;
            btnBuscarProv.Enabled = true;
        }

        private void inhabilitar()
        {
            dgvDTOrdenCompra.Rows.Clear();

            txtCliente.ReadOnly = true;
            txtDireccion.ReadOnly = true;
            dtpFecha.Enabled = false;
            rbContado.Enabled = false;
            rbCredito.Enabled = false;
            btnAgregar.Enabled = false;
            btnQuitar.Enabled = false;
            cbIVI.Enabled = false;
            cbEntregado.Enabled = false;
            txtCantidad.ReadOnly = true;
            txtPrecioUnitario.ReadOnly = true;

            txtDescuento.Text = "0,0";
            txtDescuento.ReadOnly = true;
            cbDescuento.Enabled = false;
            btnBuscarProd.Enabled = false;
            txtCliente.Text = "";
            txtDireccion.Text = "";
            txtCantidad.Text = "";
            //txtPrecioUnitario.Text = "";
            txtSubTotal.Text = "0,0";
            txtIVI.Text = "0,0";
            txtTotal.Text = "0,0";

            btnNuevo.Enabled = true;
            btnGuardar.Enabled = false;
            btnEliminar.Enabled = true;
            btnCancelar.Enabled = false;
            btnBuscarOrden.Enabled = true;
            btnOrdenProv.Enabled = true;
            btnBuscarProv.Enabled = false;
        }

        #endregion

        private void btnBuscarProd_Click(object sender, EventArgs e)
        {
            buscador = new GLOBuscador();
            buscador.Entidad = (int)GLOBuscador.Entidades.OrdenProd;
            buscador.FormClosed += new FormClosedEventHandler(buscadorProd_Closed);
            buscador.ShowDialog();
        }

        private void buscadorProd_Closed(object sender, FormClosedEventArgs e)
        {
            try
            {
                cargarInfoProducto(Cache.ordproducto.Cells[0].Value.ToString());   
            }
            catch (NullReferenceException) { }
        }

        private void buscadorProv_Closed(object sender, FormClosedEventArgs e)
        {
            try
            {
                txtProveedor.Text = Cache.ordproveedor.Cells[2].Value.ToString();
            }
            catch (NullReferenceException) { }
        }

        private void buscadorOrden_Closed(object sender, FormClosedEventArgs e)
        {
            try
            {
                dtOrdenesCompra = SCMOrdenCompra.consultarXID(Convert.ToInt32(Cache.orden.Cells[0].Value.ToString()));
                cargarOrden();
            }
            catch (FormatException) { }
            catch (NullReferenceException) { }
        }

        private void cargarInfoProducto(string IdProducto)
        {
            try
            {
                txtNombreProd.Text = "";
                txtPrecioUnitario.Text = "";
                txtPrecioUnitario.ReadOnly = false;
                DataTable dt = SCMProducto.consultarXID(int.Parse(IdProducto));
                DataRow dr = dt.Rows[0];
                txtNombreProd.Text = dr["Nombre"].ToString();
                dt = SCMPrecioVenta.consultarPrecioVentaMAX(int.Parse(dr["IdProducto"].ToString()));
                dr = dt.Rows[0];
                txtPrecioUnitario.Text = dr["PrecioVenta"].ToString();
            }
            catch (FormatException) { }
            catch (IndexOutOfRangeException) { }
            catch (NullReferenceException) { }
        }

        private void btnBuscarOrden_Click(object sender, EventArgs e)
        {
            buscador = new GLOBuscador();
            buscador.Entidad = (int)GLOBuscador.Entidades.Orden;
            buscador.FormClosed += new FormClosedEventHandler(buscadorOrden_Closed);
            buscador.ShowDialog();
        }

        private void btnBuscarProv_Click(object sender, EventArgs e)
        {
            buscador = new GLOBuscador();
            buscador.Entidad = (int)GLOBuscador.Entidades.OrdenProv;
            buscador.FormClosed += new FormClosedEventHandler(buscadorProv_Closed);
            buscador.ShowDialog();
        }

    }
}
